To improve memory access efficiency, many processors employ a memory hierarchy that includes one or more caches to store a subset of data stored in main memory. The criteria for which subset of data from the main memory is stored in the cache can vary depending on the processor design, but typically prioritizes the caching of data that has recently been accessed. As new data is moved into the one or more caches, the processor selects previously-stored data for eviction based on a specified replacement scheme, but conventional replacement schemes often result in undesirably low memory access efficiency.